#include "GestorDeCliente.h"
#include "../common/Conversor.h"
#include "Servidor.h"
#include <iostream>
GestorDeCliente::GestorDeCliente(Socket *sock,std::vector<PartidaMultijugador*> *partidas, Servidor *servidor)
{
	this->servidor = servidor;
	this->partidas = partidas;
	this->socket = sock;
	inbox = new Inbox(this, this->socket);
	partida = NULL;
	conectado = false;
}

GestorDeCliente::~GestorDeCliente(void)
{
	delete(inbox);
}

void GestorDeCliente::Start(){
	inbox->Start();
}

void GestorDeCliente::Stop() {
	inbox->Stop();
}
void GestorDeCliente::crearPartida(short nivel, short cantidadDeJugadores) {
	partida = servidor->crearPartida(this, nivel, cantidadDeJugadores);
	conectado = true;
}

bool GestorDeCliente::unirseAPartida(short iDPartida) {
	for (size_t i = 0; i < partidas->size(); i++) {
		if ( (*partidas)[i]->getId() == iDPartida){
			partida = (*partidas)[i];
			conectado = partida->conectarCliente(this);
			break;
		}
	}
	return conectado;
}

void GestorDeCliente::confirmarInicio() {
	partida->confirmarInicio();
}

void GestorDeCliente::desconectarDePartida(){
	if (conectado){
		conectado = false;
		Stop();
	}
}

void GestorDeCliente::matarPartida(){
	servidor->matarPartida(partida);
}

void GestorDeCliente::lanzarHuevo(short velX, short velY) {
	partida->getJuego()->lanzarHuevo(idEnPartida, velX, velY);
}

void GestorDeCliente::notificarObjetoNuevo(Objeto *obj) {
	socket->enviar(Conversor::serializar(obj));
}

void GestorDeCliente::notificarObjetoDestruido(short id) {
	socket->enviar(Conversor::serializar('B',id));
}

void GestorDeCliente::setIdEnPartida(short id) {
	idEnPartida = id;
}

short GestorDeCliente::getIdEnPartida() {
	return idEnPartida;
}

void GestorDeCliente::notificarPartidas(){
	socket->enviar(Conversor::serializar(partidas));
}

void GestorDeCliente::notificarInicio(){
	socket->enviar(Conversor::serializar('I'));
}

void GestorDeCliente::notificarPartidaGanada(){
	socket->enviar(Conversor::serializar('W'));
}
void GestorDeCliente::notificarPartidaPerdida(){
	socket->enviar(Conversor::serializar('E'));
}
	
